package product;


import enums.ProductBelong;
import helper.CacheCallBack;
import helper.CacheHelper;
import models.BaseModel;
import models.constants.DeletedStatus;
import product.enums.ProductAttribute;
import product.enums.ProductDivision;
import product.merchant.ProductSpecMerchant;
import product.type.AdminProductType;
import util.common.ConvertUtil;

import javax.persistence.*;
import java.util.Date;
import java.util.List;

/**
 * 产品基本信息
 * 产品添加时
 * 1. 需要调用 AliyunOpenSearch.uploadProduct 方法 . 将 product 信息 保存到 Aliyun OpenSearch 中
 * 2. 需要调用 CacheHelper.productAddToCache 方法. 将 product 信息 保存到 Cache中.
 * Created by upshan on 15/7/7.
 */
@Entity
@Table(name = "products")
public class Product extends BaseModel {

    public static final String CACHE_PRODUCT_LIST = "ULC_CACHE_PORDUCT_LIST";
    public static final String CACHE_PRODUCT_ID = "ULC_CACHE_PRODUCT_";
    public static final String REDIS_LOCK_KEY = "LocalCouponLock";


    /**
     *产品编号
     */
    @Column(name = "code")
    public String code;

    /**
     * 名称
     */
    @Column(name = "name")
    public String name;

    /**
     * 产品归属 ,SELF_SUPPORT:自营;AGENT_PRODUCT:入住\代理产品
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "product_belong")
    public ProductBelong productBelong;

    /**
     * 主图 在切换型号的时候展示
     */
    @Column(name = "main_image")
    public String mainImage;

    /**
     * 产品划分
     * ENTITY //实物
     ,INVENTED  // 虚拟卡
     */
    @Enumerated(EnumType.STRING)
    @Column(name="product_division")
    public ProductDivision productDivision;

    /**
     * 会员卡类型
     */
    @Enumerated(EnumType.STRING)
    public ProductAttribute type;

    /**
     * 所属分类
     */
    @ManyToOne
    @JoinColumn(name = "admin_product_type_id")
    public AdminProductType adminProductType;

    /**
     * 前端展示价格
     * 比如 10~30
     */
    @Column(name = "show_price")
    public String showPrice;

    /**
     * 市场价格
     */
    @Column(name = "market_price")
    public Double marketPrice;


    /**
     * 做促销时候 展示原价使用
     */
    @Column(name = "old_price")
    public Double oldPrice;

    /**
     * 卖点
     */
    @Column(name = "selling_point")
    public String sellingPoint;

    /**
     * 展示 生产日期不展示买点
     * 否的时候，展示买点
     */
    @Column(name = "show_production_date")
    public Boolean showProductionDate = false;


    /**
     * 规格型号
     */
    @Column(name = "standard")
    public String standard;


    /**
     * 产品内容介绍
     */
    @Lob
    @Column(name = "content")
    public String content;


    /**
     * Pc产品详情展示
     */
    @Lob
    @Column(name = "pc_content")
    public String pcContent;



    /**
     * 创建时间
     */
    @Column(name = "created_at")
    public Date createdAt;

    /**
     * 创建时间
     */
    @Transient
    public String createTimeStr;

    /**
     * 逻辑删除,0:未删除，1:已删除
     */
    @Enumerated(EnumType.ORDINAL)
    public DeletedStatus deleted;

    /**
     * 备注
     */
    @Column(name = "remark")
    public String remark;

    public static Product findByIdFromCache(final Long id) {
        return CacheHelper.getCache(CacheHelper.CACHE_PRODUCT + id, new CacheCallBack<Product>() {
                    @Override
                    public Product loadData() {
                        Product product = Product.find("id = ?" , id).first();
                        return product;
                    }
                });
    }

    @Transient
    public String getRedisLockKey() {
        return Product.REDIS_LOCK_KEY + this.id + "@product";
    }

    //生成产品编号
    public static String createCode(AdminProductType adminProductType) {
        long number = Product.count("adminProductType.id=?", adminProductType.id) + 1;
        return number>=10000? ConvertUtil.toString(adminProductType.code)+number:ConvertUtil.toString(adminProductType.code)+ConvertUtil.toString(10000+number).substring(1);
    }
    /**
     * 根据id查询产品
     */
    public static Product findByProductId(long id){
        return Product.find("id=? and deleted=?",id,DeletedStatus.UN_DELETED).first();
    }

    /**
     * 获取商品在同一商户下不同的规格,返回字符串
     * @param specMerchant
     * @return
     */
    public static String SetStandard(ProductSpecMerchant specMerchant){
        String standard = "";
        long merchantId = ConvertUtil.toLong(specMerchant.merchant.id);
        long productId = ConvertUtil.toLong(specMerchant.productSpec.product.id);
        List<ProductSpecMerchant> specMerchantList = ProductSpecMerchant.find(" productSpec.product.id = ? and merchant.id = ? and deleted = 0",productId,merchantId ).fetch();
        for(ProductSpecMerchant productSpecMerchant : specMerchantList){
            standard +="/"+ConvertUtil.toString(productSpecMerchant.productSpec.spec);
        }
        return standard;

    }



}
